﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace BT2_XuLyDuLieu
{
    public partial class MainForm : Form
    {
        /// <summary>
        ///  VAR INIT
        /// </summary>
        #region VarInit
        private DataTable dt;

        private bool isReady = false;
        private bool isData = false;
        private bool[] isNumberic;

        private NumbericItem[] numbericInfo;
        private List<StringItem>[] tangSoXuatHienCuaChuoi;

        /// <summary>
        ///  struct 
        /// </summary>
        private struct NumbericItem
        {
            public float min;
            public float max;
            public float mean;
            public float doLechChuan;
            public int missing;
        }

        public struct StringItem
        {
            public string noiDungChuoi;
            private int soLanXuatHien;
            public int missing;

            public int SoLanXuatHien
            {
                get { return soLanXuatHien; }
                set { soLanXuatHien = value; }
            }
        }

        #endregion

        public MainForm()
        {
            InitializeComponent();
        }

        // ---------------------------------- User Define Function ---------------------------------

        #region UserDefineFunction

        //hàm nảy hổ trợ
        private void QuetThuocTinh()
        {
            //khởi tạo mảng để lưu thông tin.
            numbericInfo = new NumbericItem[dt.Columns.Count];
            tangSoXuatHienCuaChuoi = new List<StringItem>[dt.Columns.Count];

            //quét các thuộc tính của dữ liệu.
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                //nếu nó là numberic thì mình xét
                if (isNumberic[i])
                {
                    //khởi tạo các giá trị mặc định của thông tin
                    numbericInfo[i].max = 0;
                    for (int j = 0; j < dt.Rows.Count; j++)
                    {
                        if (!(dt.Rows[j][i] == DBNull.Value))
                        {
                            numbericInfo[i].min = float.Parse(dt.Rows[j][i].ToString());
                        }
                        
                    }
                    
                    numbericInfo[i].missing = 0;

                    //tạo biến để lưu tổng phục vụ cho việc tính mean.
                    float sum = 0;

                    //duyệt theo dòng.
                    for (int j = 0; j < dt.Rows.Count; j++)
                    {
                        if (dt.Rows[j][i]==DBNull.Value)
                        {
                            numbericInfo[i].missing++;
                        }
                        else
                        {
                            float temp = float.Parse(dt.Rows[j][i].ToString());
                            //tính max.
                            numbericInfo[i].max = numbericInfo[i].max > temp ? numbericInfo[i].max : temp;
                            //tính min
                            numbericInfo[i].min = numbericInfo[i].min < temp ? numbericInfo[i].min : temp;
                            //tính sum
                            sum += temp;
                        }
                    }

                    //xuất ra giá trị trung bình vào mảng = sum / số lượng phần tử - số lượng "?"
                    numbericInfo[i].mean = dt.Rows.Count != numbericInfo[i].missing ? sum / (dt.Rows.Count - numbericInfo[i].missing) : 0;


                    double tempSumPS = 0;
                    //tính độ lệch chuẩn cho mỏi thằng.
                    for (int j = 0; j < dt.Rows.Count; j++)
                    {
                        if (!(dt.Rows[j][i] == DBNull.Value))
                            tempSumPS += Math.Pow((float.Parse(dt.Rows[j][i].ToString()) - numbericInfo[i].mean), 2);
                    }

                    tempSumPS = tempSumPS / (dt.Rows.Count - numbericInfo[i].missing);
                    numbericInfo[i].doLechChuan = (float)Math.Sqrt(tempSumPS);
                }
                else
                {
                    tangSoXuatHienCuaChuoi[i] = new List<StringItem>();

                    // duyệt theo từng dòng.
                    for (int j = 0; j < dt.Rows.Count; j++)
                    {
                        if (dt.Rows[j][i] == null)
                            numbericInfo[i].missing++;
                        else
                            KiemTraStringTrongList(dt.Rows[j][i].ToString(), ref tangSoXuatHienCuaChuoi[i]);
                    }

                    // sắp xếp lại mảng vừa thống kê được. (dành cho nominal)
                    SapXepTheoTangSoXuatHien();

                }
            }

            
            isReady = true;
        }

        /// <summary>
        /// Chuẩn hóa Z-Score
        /// </summary>
        private void ChuanHoaZScore()
        {
            if (isData)
            {
                if (isReady)
                {
                    int temp = 0;

                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        if (lvAttributesInfo.Items[i].Checked)
                        {
                            temp++;
                        }
                    }


                    if (DialogResult.Yes == MessageBox.Show(string.Format("Are you sure Z-Score normalization {0} attribute(s)?", temp), "Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question))
                    {
                        // Code
                        for (int i = 0; i < dt.Columns.Count; i++)
                        {
                            if (lvAttributesInfo.Items[i].Checked)
                            {
                                for (int j = 0; j < dt.Rows.Count; j++)
                                {
                                    if (dt.Rows[j][i] == DBNull.Value)
                                        continue;

                                    float tempZSC = float.Parse(dt.Rows[j][i].ToString());

                                    float result = (tempZSC - numbericInfo[i].mean) / numbericInfo[i].doLechChuan;

                                    dt.Rows[j][i] = result.ToString();
                                }
                            }
                        }

                        QuetThuocTinh();
                        RefeshForm();
                    }
                }
            }
            else
            {
                MessageBox.Show("Data is null!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }

        /// <summary>
        /// Xác định kiểu dữ liệu cho từng thuộc tính trên bảng.
        /// </summary>
        private void XacDinhKieuDuLieu()
        {
            isNumberic = new bool[dt.Columns.Count];

            for (int i = 0; i < dt.Columns.Count; i++)
            {
                for (int j = 0; j < dt.Rows.Count; j++)
                {
                    float temp;

                    //nếu mà dt là null thì cho qua, mình không xét.
                    if (dt.Rows[j][i] == DBNull.Value) 
                        continue;

                    // nếu phần tử này không phải bị thêếu thì mình thử tryparse nó.
                    if (float.TryParse(dt.Rows[j][i].ToString().Trim(), out temp))
                    {
                        // try parse thành công nên nó là số.
                        isNumberic[i] = true;

                    }
                    else
                        isNumberic[i] = false; //không được nên nó là chuổi.

                    //dừng dòng for.
                    break;
                }
            }
        }

        /// <summary>
        /// Thay thế ? thành số trung bình của thuộc tính đó.
        /// </summary>
        /// <param name="index">chỉ số thuộc tính</param>
        private void NumbericReplace(int index)
        {//thay các giá trị đó vào các giá trị ?

            float soTrungBinh = numbericInfo[index].mean;

            //chạy dòng for duyệt hết các hàng.
            for (int j = 0; j < dt.Rows.Count; j++)
            {
                //nếu dữ liệu của nó đang làm ? thì chuyển nó thành số trung bình, không thì giữ giá trị cũ.
                if (dt.Rows[j][index] == DBNull.Value)
                {
                    dt.Rows[j][index] = soTrungBinh.ToString();
                }
            }
        }

        /// <summary>
        /// Thay thế giá trị ? thành chuổi có số lần xuất hiện nhiều nhất
        /// </summary>
        /// <param name="index">chỉ số của chuổi.</param>
        private void NominalReplace(int index)
        {
            for (int j = 0; j < dt.Rows.Count; j++)
            {
                if (dt.Rows[j][index] == DBNull.Value)
                {
                    dt.Rows[j][index] = tangSoXuatHienCuaChuoi[index][0].noiDungChuoi;
                }
            }    
        }

        private void SapXepTheoTangSoXuatHien()
        {
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                if (isNumberic[i] == false)
                {
                    for (int j = 0; j < dt.Rows.Count; j++)
                    {
                        for (int k = j; k < dt.Rows.Count; k++)
                        {
                            //nếu thằng đứng trước lớn hơn thằng đứng sau thì mình đổi vị trí.
                            if (tangSoXuatHienCuaChuoi[i][j].SoLanXuatHien > tangSoXuatHienCuaChuoi[i][k].SoLanXuatHien)
                            {
                                StringItem temp = tangSoXuatHienCuaChuoi[i][j];
                                tangSoXuatHienCuaChuoi[i][j] = tangSoXuatHienCuaChuoi[i][k];
                                tangSoXuatHienCuaChuoi[i][k] = temp;
                            }
                        }
                    }
                }
            }
        }


        private void ChuanHoaMinMax(float min, float max, int index)
        {
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                if (dt.Rows[i][index] == DBNull.Value)
                    continue;

                float item = float.Parse(dt.Rows[i][index].ToString());

                //giá trị của item sau chuyển hóa min - max
                float result = ((item - numbericInfo[index].min) / (numbericInfo[index].max - numbericInfo[index].min)) * (max - min) + min;

                dt.Rows[i][index] = result.ToString();
            }
        }

        private void ChuanHoaMinMax(float min, float max)
        {
            for (int i = 0; i < lvAttributesInfo.Items.Count;i++)
            {
                if (lvAttributesInfo.Items[i].Checked && isNumberic[i])
                {
                    ChuanHoaMinMax(min, max, i);
                }
            }
        }
        /// <summary>
        /// Đưa dữ liệu là các tên listview chứa thuộc tính
        /// </summary>
        private void LoadDuLieuLenListView()
        {
            lvAttributesInfo.Items.Clear();

            if (dt != null)
            {
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    int stt = i + 1;

                    ListViewItem lvItem = new ListViewItem((stt).ToString());
                    lvItem.SubItems.Add(dt.Columns[i].ColumnName);

                    //nhét vô listview
                    lvAttributesInfo.Items.Add(lvItem);
                }
            }
        }

        /// <summary>
        /// Tìm String trong List StringItem. nếu thấy thì cộng số lần xuất hiện, không thấy thì thêm chuổi mới/
        /// </summary>
        /// <param name="str">chuổi cần tìm</param>
        /// <param name="lstString">mảng để tìm.</param>
        private void KiemTraStringTrongList(string str, ref List<StringItem> lstString)
        {
            //tạo cờ thêm.
            bool them = true;

            for (int i = 0; i < lstString.Count; i++)
            {
                StringItem temp = lstString[i];

                if (temp.noiDungChuoi == str)
                {
                    //nếu tìm gặp thì mình không thêm phần tử mới vào list.
                    them = false;
                    temp.SoLanXuatHien++;
                }

                lstString[i] = temp;
            }

            if (them)
            {
                StringItem temp = new StringItem();

                temp.noiDungChuoi = str;
                temp.SoLanXuatHien = 0;

                lstString.Add(temp);
            }

        }

        private void ShowInfoCuaAttribute(int index)
        {
            lvAttributein.Items.Clear();

            if (isNumberic[index])
            {// éếu mà thuộc tính dạng số thì mình xuất
                ListViewItem item = new ListViewItem();

                // thêm missing
                item.Text = "Missing";
                item.SubItems.Add(string.Format("{0} ({1}%)", numbericInfo[index].missing, Math.Round( (1.0 * numbericInfo[index].missing) / dt.Rows.Count)));

                lvAttributein.Items.Add(item);

                // thêm max
                item = new ListViewItem();

                item.Text = "Max";
                item.SubItems.Add(numbericInfo[index].max.ToString());

                lvAttributein.Items.Add(item);

                // thêm min
                item = new ListViewItem();

                item.Text = "Min";
                item.SubItems.Add(numbericInfo[index].min.ToString());

                lvAttributein.Items.Add(item);

                //thêm mean
                item = new ListViewItem();

                item.Text = "Mean";
                item.SubItems.Add(numbericInfo[index].mean.ToString());

                //thêm độ lệch chuẩn);
                item = new ListViewItem();

                item.Text = "Standard Deviation";
                item.SubItems.Add(numbericInfo[index].doLechChuan.ToString());

                lvAttributein.Items.Add(item);
            }
            else
            {
                //chuổi
                ListViewItem item = new ListViewItem();
                
                // thêm missing
                item.Text = "Unique";
                item.SubItems.Add(tangSoXuatHienCuaChuoi[index].Count.ToString());

                lvAttributein.Items.Add(item);


                item.Text = "featured string (frequency)";
                item.SubItems.Add(string.Format("{0} ({1} - {2}%)", tangSoXuatHienCuaChuoi[index][0].noiDungChuoi, tangSoXuatHienCuaChuoi[index][0].SoLanXuatHien, (float)tangSoXuatHienCuaChuoi[index][0].SoLanXuatHien / tangSoXuatHienCuaChuoi[index].Count));

                lvAttributein.Items.Add(item);

                item.Text = "missing value";
                item.SubItems.Add(numbericInfo[index].missing.ToString());
                lvAttributein.Items.Add(item);














            }
        }

        private void RefeshForm()
        {
            //xác định kiểu dữ liệu cho từng thuộc tính / cột
            XacDinhKieuDuLieu();
            //tạo 1 luồng mới để chuẩn bị dữ liệu trong khi chờ đợi.
            Thread thre = new Thread(QuetThuocTinh);
            thre.Start();

            //Gán vài giá trị cần thiết lên form.
            lbSoLuongCot.Text = dt.Columns.Count.ToString();
            lbSoLuongPhanTu.Text = dt.Columns.Count == 0? "0" : dt.Rows.Count.ToString();

            // Load dữ liệu lên listviewItem
            LoadDuLieuLenListView();
            ShowSelectedAttributeInfo(0);
        }

        private void ChiaGioTheoChieuRong(int index, int bins)
        {
            float count = numbericInfo[index].max - numbericInfo[index].min;
            float mienGiaTriTrongGio = count / (float)bins;

            float temp = numbericInfo[index].min;
            float tempPlus = numbericInfo[index].min + mienGiaTriTrongGio;

            while (temp <= numbericInfo[index].max)
            {
                float mean = 0;
                int dem = 0;

                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    if (dt.Rows[i][index] == DBNull.Value)
                        continue;

                    float value = float.Parse(dt.Rows[i][index].ToString());

                    if (value >= temp && value < tempPlus)
                    {
                        mean += value;
                        dem++;
                    }
                }

                mean = mean / (dem);

                // thay đổi các miền giá trị trong giỏ.
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    if (dt.Rows[i][index] == DBNull.Value)
                        continue;

                    float value = float.Parse(dt.Rows[i][index].ToString());

                    if (value >= temp && value < tempPlus)
                    {
                        dt.Rows[i][index] = mean.ToString();
                    }
                }


                temp += mienGiaTriTrongGio;
                tempPlus += mienGiaTriTrongGio;
            }
        }

        private void CopyDatarows(DataRow dtr1, DataRow dtr2)
        {
            for (int i = 0; i < dtr2.ItemArray.Count(); i++)
            {
                dtr1.ItemArray[i] = dtr2.ItemArray[i];
            }
        }

        private void ChiaGioTheoChieuSau(int index, int bins)
        {
            //tính miền phần tử
            float temp = (float)dt.Rows.Count / bins;
            temp += (float)0.5;

            int mienGiaTri = (int)Math.Round(temp);




            //sắp xếp mảng theo chiều tăng dần.
            DataView dtv = dt.DefaultView;
            dtv.Sort = string.Format("{0} ASC", dt.Columns[index].ColumnName);
            dt = dtv.ToTable();

           


            // chia giỏ.
            int t = 0;
            int minTemp = 0;
            float sum = 0;
            int count = 0; 

            while (t < dt.Rows.Count)
            {
                if ((t >= minTemp && t <= mienGiaTri) && (t != dt.Rows.Count - 1))
                {
                    if (dt.Rows[t][index] != DBNull.Value)
                    {
                        sum += float.Parse(dt.Rows[t][index].ToString());
                        count++;
                    }
                }
                else if (t > mienGiaTri)
                {
                    //đã giải quyết xong cho miền giá trị đầu.
                    float avega = sum / (float)count;

                    for (int i = minTemp; i <= mienGiaTri; i++)
                    {
                        if (dt.Rows[i][index] == DBNull.Value)
                        {
                            continue;
                        }

                        dt.Rows[i][index] = avega.ToString();
                    }

                    //xét giá trị cho miền kết tiếp.
                    sum = 0;
                    count = 0;

                    int tempFlag = minTemp+1;
                    minTemp = mienGiaTri+1;
                    mienGiaTri = tempFlag + minTemp;

                    t--;
                }
                else
                {
                    float avega = sum / (float)count;

                    for (int i = minTemp; i <= minTemp + count; i++)
                    {
                        if (dt.Rows[i][index] == DBNull.Value)
                            continue;
                        
                        dt.Rows[i][index] = avega.ToString();
                    }
                }

                t++;
            }

        }

        private void ShowSelectedAttributeInfo(int index)
        {
            if (index >= 0)
            {
                lbAtributesName.Text = dt.Columns[index].ColumnName;
                lbAttribyteType.Text = isNumberic[index] ? "Numberic" : "Nominal";
                ShowInfoCuaAttribute(index);
            }
            else
            {
                lbAtributesName.Text = string.Empty;
                lbAttribyteType.Text = string.Empty;
                lvAttributein.Items.Clear();
            }
        }

        #endregion
        // --------------------------------- Visual Auto Generate



        private void btnOpenFile_Click(object sender, EventArgs e)
        {
            OpenFileDialog open = new OpenFileDialog();

            if (open.ShowDialog() == DialogResult.OK)
            {
                FormLoadData frm = new FormLoadData();
                DataSet ds = new DataSet();

                frm.FilePath = open.FileName;
                frm.ShowDialog();

                ds = frm.Data;

                if (ds == null)
                {
                    isData = false;
                    return;
                }
                else {isData = true; dt = ds.Tables[0];}

                lbFileName.Text = frm.FileName;
                //làm mới lại frm.
                RefeshForm();
            }

        }

        private void btnOpenUrl_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Chức năng đang được xây dựng!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void MainForm_Load(object sender, EventArgs e)
        {

        }

        //Sự kiện indexchange trong listview Attributes
        private void lvAttributesInfo_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (lvAttributesInfo.SelectedItems.Count >= 0)
                {
                    int stt = int.Parse(lvAttributesInfo.SelectedItems[0].Text);

                    ShowSelectedAttributeInfo(stt - 1);
                }
            }
            catch
            {
                return;
            }
        }

        //bấm vào nút all
        private void btnAttributesSelectAll_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < lvAttributesInfo.Items.Count; i++)
            {
                lvAttributesInfo.Items[i].Checked = true;
            }
        }

        //bấm vào nút none
        private void btnNoneSelect_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < lvAttributesInfo.Items.Count; i++)
            {
                lvAttributesInfo.Items[i].Checked = false;
            }
        }

        // bấm vào nút invert
        private void btnInvert_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < lvAttributesInfo.Items.Count; i++)
            {
                lvAttributesInfo.Items[i].Checked = lvAttributesInfo.Items[i].Checked ? false : true ;
            }
        }

        //bấm vào nút replace data.
        private void btnReplaceData_Click(object sender, EventArgs e)
        {
            if (isData)
            {
                if (!isReady)
                {
                    if (DialogResult.Retry == MessageBox.Show("The application is preparing data, Try again", "Information", MessageBoxButtons.RetryCancel, MessageBoxIcon.Information))
                    {
                        btnReplaceData_Click(sender, e);
                        return;
                    }
                    else
                        return;
                }

                bool flagChecker = false;

                for (int i = 0; i < lvAttributesInfo.Items.Count; i++)
                {
                    if (lvAttributesInfo.Items[i].Checked)
                    {
                        flagChecker = true;
                        //bấm đầu thực hiện replace thằng thuộc tính i

                        if (isNumberic[i])
                        {
                            //éếu là numberic thì gọi numberic
                            NumbericReplace(i);
                            numbericInfo[i].missing = 0;

                        }
                        else
                            NominalReplace(i);

                        
                    }
                }

                if (!flagChecker)
                {
                    MessageBox.Show("The number of Attribute(s) you wanna replace is zero! Check it again", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    MessageBox.Show("Success!", "Infomation", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else
            {
                MessageBox.Show("Data is null, choise a data file and check again!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnRemoveAttributes_Click(object sender, EventArgs e)
        {
            int counter = 0;

            for (int i = 0; i < lvAttributesInfo.Items.Count; i++)
            {
                if (lvAttributesInfo.Items[i].Checked)
                {
                    counter++;
                }
            }

            if (DialogResult.Yes == MessageBox.Show(string.Format("Are you sure delete {0} attributes?", counter), "Warring", MessageBoxButtons.YesNo,MessageBoxIcon.Information))
            {
                for (int i = lvAttributesInfo.Items.Count-1; i >= 0 ; i--)
                {
                    if (lvAttributesInfo.Items[i].Checked)
                        dt.Columns.RemoveAt(i);
                }


                RefeshForm();
                if (lvAttributein.Items.Count == 0)
                {
                    ShowSelectedAttributeInfo(-1);
                }
                else
                {
                    ShowSelectedAttributeInfo(0);
                }
            }
        }

        private void btnChuanHoaMinMax_Click(object sender, EventArgs e)
        {
            if (isData)
            {
                if (isReady)
                {
                        min_max_normalization frm = new min_max_normalization();

                        frm.ShowDialog();

                        if (frm.IsOK)
                        {
                            float min = frm.Min;
                            float max = frm.Max;

                            ChuanHoaMinMax(min, max);
                            QuetThuocTinh();
                            RefeshForm();
                        }
                }
            }
            else MessageBox.Show("Data is null!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        private void btnSCORE_Click(object sender, EventArgs e)
        {
            ChuanHoaZScore();
        }

        private void btnBinning_Click(object sender, EventArgs e)
        {
            if (isData)
            {
                if (isReady)
                {
                    int counter = 0;

                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        if (lvAttributesInfo.Items[i].Checked)
                        {
                            counter++;
                        }
                    }

                    if (counter != 0)
                    {

                        BinningType frm = new BinningType();

                        frm.ShowDialog();

                        if (frm.IsOK)
                        {
                            if (DialogResult.Yes == MessageBox.Show(string.Format("{0} Attribute(s) will be binning!", counter), "Information", MessageBoxButtons.YesNo, MessageBoxIcon.Information))
                            {
                                if (frm.IsWidth)
                                {
                                    //chia theo chieu rộng.
                                    for (int i = 0; i < lvAttributesInfo.Items.Count; i++)
                                    {
                                        if (lvAttributesInfo.Items[i].Checked)
                                        {
                                            ChiaGioTheoChieuRong(i, frm.Bins);
                                        }
                                    }
                                }
                                else 
                                {
                                    //chia theo chieu sau
                                    for (int i = 0; i < lvAttributesInfo.Items.Count; i++)
                                    {
                                        if (lvAttributesInfo.Items[i].Checked)
                                        {
                                            ChiaGioTheoChieuSau(i, frm.Bins);
                                        }
                                    }
                                }
                            }
                        }
                        RefeshForm();
                    }
                }
            }
            else
            {
                MessageBox.Show("Data is null!", "Error");
            }
        }

        private void btnViewData_Click(object sender, EventArgs e)
        {
            ViewData vd = new ViewData();

            vd.Dt = dt;
            vd.ShowDialog();
        }

        private void btnSaveData_Click(object sender, EventArgs e)
        {
            SaveFileDialog save = new SaveFileDialog();

            save.Filter = "Text file|*.txt|CSV File|*.csv|Excel 2003 Document|*.xls|Excel 2010|*.xlsx";
            save.Title = "Save Data File";
            save.FileName = "Untitles Data File";

            if (DialogResult.OK == save.ShowDialog())
            {
                if (save.CheckFileExists)
                {
                    if (DialogResult.No == MessageBox.Show("The file name is exists, Overight it?", string.Empty, MessageBoxButtons.YesNo, MessageBoxIcon.Question))
                    {
                        return;
                    }
                }


                FileControl fc = new FileControl();

                string result =  fc.SaveFile(save.FileName, save.FileName.Split('.')[save.FileName.Split('.').Count() - 1], dt, isNumberic);

                MessageBox.Show(result);
            }
        }
    }
}